﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Data;


namespace DataAccess
{
    public class ControllerRespuesta
    {
        #region ATRIBUTOS

        private SqlConnection conexion = DBConnection.getInstancia().getConnection();
        private static ControllerRespuesta unConRes;

        #endregion
        
        #region SINGLETON

        public static ControllerRespuesta getInstancia()
        {
            if(unConRes == null)
            {
                unConRes = new ControllerRespuesta();
            }
            return unConRes;
        }

        #endregion

        #region CONSTRUCTORES

        private ControllerRespuesta()
        {}

        #endregion

        #region METODOS

        //Insertar una nueva respuesta.
        public void insertRespuesta(string pTexto, Int32 pNroSolicitud, Int32 pIdMen)
        {
            try
            {
                //Se abre la conexion.
                conexion.Open();
                //Se declara la transaccion.
                SqlTransaction trans = conexion.BeginTransaction(IsolationLevel.Serializable);
                //Se crea el comando.
                SqlCommand comm = conexion.CreateCommand();
                //Se le asigna la transaccion a la propiedad transaction del comando.
                comm.Transaction = trans;
                try
                {
                    //Insertamos en la tabla Mensajes.
                    comm.CommandText = "INSERT INTO mensajes(mentexto, mennrosolicitud) VALUES (@mentexto, @mennrosolicitud);";
                    comm.Parameters.AddWithValue("mentexto", truncar(pTexto,499));
                    comm.Parameters.AddWithValue("mennrosolicitud", pNroSolicitud);
                    //Se ejecuta el comando.
                    comm.ExecuteNonQuery();
                    //Se obiene el ultimo id en la tabla mensajes.
                    Int32 idMensaje = ControllerMensaje.getInstancia().getUltimoId(trans);
                    //Insertamos en la tabla Respuestas.
                    comm.CommandText = "INSERT INTO respuestas(resid, residmensaje) VALUES (@resid, @residmensaje);";
                    comm.Parameters.AddWithValue("resid", idMensaje);
                    comm.Parameters.AddWithValue("residmensaje", pIdMen);
                    //Se ejecuta el comando.
                    comm.ExecuteNonQuery(); 
                    //Se hace el commit.
                    trans.Commit();
                }
                catch(Exception e)
                {
                    try
                    {
                        //Hacemos el rollback.
                        trans.Rollback();
                    }
                    catch(Exception ex)
                    {
                        throw new Exception("Error al realizar el rollback");
                    }

                    throw new Exception("Error al insertar una nueva respuesta");
                }
            }
            catch(Exception ex)
            {
                throw new Exception("Error al insertar una nueva respuesta: " + ex.Message);
            }
            finally
            {
                //Se cierra la conexion.
                conexion.Close();
            }
        }

        //Actualizar respuesta.
        public void updateRespuesta(string pTexto, Int32 pResId)
        {
            ControllerMensaje.getInstancia().updateMensaje(pTexto, pResId);
        }

        //Dar respusta por numero de mensaje asociado.
        public DataTable getRespuestaByNroMensaje(Int32 idMen)
        {
            //Consulta.
            string sql = "SELECT m.menid AS Id, m.mentexto AS Texto, m.menfecha AS Fecha FROM mensajes AS m WHERE m.menid IN (SELECT resid FROM respuestas WHERE residmensaje = @mensaje);";
            //Se crea el datatable.
            DataTable myDt = new DataTable();
            //Se crea el comando.
            SqlCommand myComm = new SqlCommand(sql, conexion);
            myComm.Parameters.AddWithValue("mensaje", idMen);
            //Se crea el data adapter para llenar la tabla y se le pasa el comando como parametro.
            SqlDataAdapter myDa = new SqlDataAdapter(myComm);
            try
            {
                //Se abre la conexion.
                conexion.Open();
                //Se llena la tabla con el data adapter.
                myDa.Fill(myDt);
            }
            catch (SqlException ex)
            {
                throw ex;
            }
            finally
            {
                //Se cierra la conexion.
                conexion.Close();
            }
            //Se devuelve el data table.
            return myDt;
        }
        string truncar(string unSt, int maxLength)
        {
            return unSt.Length <= maxLength ? unSt : unSt.Substring(0, maxLength);
        } 
        #endregion
    }
}
